콜백은 단순히 자바스크립트 함수를 사용하기 위한 규칙의 이름일 뿐이다. 자바스크립트 언어엔 ‘콜백’이란 것이 없다. 대부분의 함수처럼 즉시 결과를 반환하는 대신, 콜백을 사용하는 함수는 결과를 산출하는데 약간의 시간이 걸린다. 쉽게 와닿지 않는 ‘비동기’라는 단어는 일종의 ‘시간이 걸린다’ 또는 ‘지금 발생하지는 않지만 미래에 발생한다’를 의미한다. 일반적으로 콜백은 I / O를 할 때만 사용된다. (ex, 다운로드, 파일 읽기, 데이터베이스와 통신)
콜백은 당장 결과를 낼 수 없을 때, 다른 프로그램의 진행을 블록 시키지 않기 위해, 비동기 영역으로 보내버린다. 콜백을 이해하는 핵심은 비동기 작업이 완료될 때가 언제인지 모르는 경우에 콜백을 사용한다는 점이다.
콜백 지옥을 어떻게 벗어날 수 있을까?
module.exports.submit = formSubmit
function formSubmit(submitEvent) {
var name = document.querySelector('input').value
request(
{
uri: 'http://example.com/upload',
body: name,
method: 'POST',
},
postResponse
)
}
function postResponse(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return (statusMessage.value = err)
statusMessage.value = body
}모든 에러 처리를 해줄 것
간단히 Node.js 스타일을 사용해주면 됨. 여기서 콜백에 대한 첫 번째 인수는 항상 오류를 위해 예약되어 있다.
var fs = require('fs')
fs.readFile('/Does/not/exist', handleFile)
function handleFile(error, file) {
if (error) return console.error('Uhoh, there was an error', error)
// otherwise, continue on and use `file` in your code
}요점 : 항상 모든 오류를 처리해주고, 코드를 단순하게 유지한다. 중첩하지 않고, 작은 모듈로 나눠준다.
// self-assessment 3에서
fs.readfile의 callback은 다른 사람이 콜백을 넣어서 활용하라고 만들어놓은 것.
getWordCount의 콜백은 다른 사람보고 콜백을 써서 활용하라고 만들어주는 것.
우리가 fs.readFile을 사용할때
fs.readFile(filePath,' utf-8', function (err, data)) 이 경우에는 다른 사람이 만들어놓은 영역을 내가 사용하는 것.결국 콜백과 모듈은 떨어질 수 없는 관계인듯. 콜백을 이해하려고 하자 모듈을 만나게 되었다.
module.exports {
// 이 안에서 있는 애들만이 다른 문서에서 require 됐을때 사용할 수 있다.
}
혹은
// formuploader.js
module.exports.submit = formSubmit // 이렇게 추출해버릴 수 있다.
function formSubmit (submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, postResponse)
}path.dirname(”)
path.join(_dirname, ”)
노드가 어디서 실행될지 모르기 때문에
현재 위치에서 상대 경로를 지정해야 함.